package cn.iocoder.yudao.module.api.infrastructure.wechat;

import cn.iocoder.yudao.module.api.infrastructure.social.SocialClientApi;
import cn.iocoder.yudao.module.api.infrastructure.wechat.dto.WxaOrderNotifyConfirmReceiveDTO;
import cn.iocoder.yudao.module.api.infrastructure.wechat.dto.WxaUploadOrderShippingInfoDTO;
import cn.iocoder.yudao.module.api.infrastructure.wechat.vo.WechatOrderDetailVO;
import cn.iocoder.yudao.module.api.infrastructure.wechat.vo.WechatUserCheckBindVO;

/**
 * <pre>
 * OOoO0OOoO0OOOooo0oOOOO0OOOOO0oooOO0ooOOO0Ooooo0OOOOo0ooooO0OOooo0Ooooo0OOOOO
 *  这里是文件说明
 * OOoO0OOoO0OOOooo0oOOOO0OOOOO0oooOO0ooOOO0Ooooo0OOOOo0ooooO0OOooo0Ooooo0OOOOO
 * </pre>
 *
 * @author 山野羡民（1032694760@qq.com）
 * @since 2025/01/07
 * @see SocialClientApi
 */
public interface WechatClientApi {

    /**
     * 获取微信小程序 appId
     */
    String getWxMaAppId(Integer userType);

    /**
     * 获取微信小程序 openid
     *
     * @param code 授权码
     * @return 微信小程序 openid
     * @link <a href="https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html">登录流程时序</a>
     * @link <a href="https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.login.html">获取登录凭证（code）</a>
     * @link <a href="https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-login/code2Session.html">登录凭证校验获取用户身份标识（openid）</a>
     */
    String getWxMaOpenId(String code);

    /**
     * 检查微信小程序用户是否存在
     *
     * @param code 授权码
     * @return 绑定信息
     */
    WechatUserCheckBindVO checkWxMaUserExists(String code);

    /**
     * 检查微信公众号用户是否存在
     *
     * @param code 授权码
     * @return 绑定信息
     */
    WechatUserCheckBindVO checkWxMpUserExists(String code);

    /**
     * 上传订单发货信息到微信小程序
     *
     * @param userType 用户类型
     * @param dto 请求
     * @link <a href="https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/business-capabilities/order-shipping/order-shipping.html#一、发货信息录入接口">发货信息录入接口</a>
     */
    void uploadWxMaOrderShippingInfo(Integer userType, WxaUploadOrderShippingInfoDTO dto);

    /**
     * 获取微信小程序订单信息
     *
     * @param userType 用户类型
     * @param transactionId 微信订单号
     * @return 订单信息
     * @link <a href="https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/business-capabilities/order-shipping/order-shipping.html#三、查询订单发货状态">查询订单发货状态</a>
     */
    WechatOrderDetailVO getWxMaOrderInfo(Integer userType, String transactionId);

    /**
     * 微信小程序确认收货提醒接口
     *
     * @param userType 用户类型
     * @param dto 请求
     */
    void notifyWxMaOrderConfirmReceive(Integer userType, WxaOrderNotifyConfirmReceiveDTO dto);

    /**
     * 获取微信公众号 appId
     */
    String getWxMpAppId(Integer userType);

    /**
     * 获取微信公众号 openid
     *
     * @param code 授权码
     * @return 微信公众号 openid
     * @link <a href="https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html#关于特殊场景下的静默授权">关于特殊场景下的静默授权</a>
     */
    String getWxMpOpenId(String code);

}
